home *** CD-ROM | disk | FTP | other *** search
/ Windows Expert / Windows Expert.iso / windownt / xvidiff.zip / XVI.H < prev   
C/C++ Source or Header  |  1993-01-01  |  31KB  |  1,097 lines

  1. /* Copyright (c) 1990,1991,1992 Chris and John Downey */
  2. /***
  3.  
  4. * @(#)xvi.h    2.5 (Chris & John Downey) 9/1/92
  5.  
  6. * program name:
  7.     xvi
  8. * function:
  9.     PD version of UNIX "vi" editor, with extensions.
  10. * module name:
  11.     xvi.h
  12. * module function:
  13.     General definitions for xvi.
  14.  
  15.     This file should really be split up into several files
  16.     rather than being concentrated into one huge monolith.
  17.  
  18. * history:
  19.     STEVIE - ST Editor for VI Enthusiasts, Version 3.10
  20.     Originally by Tim Thompson (twitch!tjt)
  21.     Extensive modifications by Tony Andrews (onecom!wldrdg!tony)
  22.     Heavily modified by Chris & John Downey
  23.  
  24. ***/
  25.  
  26. /***************************************************************
  27.  *                                                             *
  28.  * SECTION 1: ENVIRONMENT                                      *
  29.  *                                                             *
  30.  * Most of this section is concerned with including the right  *
  31.  * header files; we also define some things by hand if the     *
  32.  * appropriate definitions are not provided by the system.     *
  33.  *                                                             *
  34.  ***************************************************************/
  35.  
  36. /*
  37.  * System include files ...
  38.  */
  39. #include <stdio.h>
  40. #include <signal.h>
  41. #include <string.h>
  42.  
  43. #ifdef WIN32
  44.  
  45. #   define  USE_STDHDRS
  46. #   define  STRERROR_AVAIL
  47. #   include <errno.h>
  48. #   include <varargs.h>
  49. #   define  VA_START(a, b)    va_start(a)
  50. #   define  P(args)        args
  51.  
  52. #else
  53.  
  54. #ifdef    __STDC__
  55.  
  56. #   define  USE_STDHDRS
  57. #   define  STRERROR_AVAIL
  58. #   include <errno.h>
  59. #   include <stdarg.h>
  60. #   define  VA_START(a, b)    va_start(a, b)
  61. #   define  P(args)        args
  62.  
  63. #else    /* not __STDC__ */
  64.  
  65. #   ifdef   ultrix
  66. #       ifdef    mips
  67. #           define  USE_STDHDRS
  68. #       endif   /* mips */
  69. #   endif   /* ultrix */
  70. #   ifdef   sparc
  71. #       define    USE_STDHDRS
  72. #   endif   /* sparc */
  73. #   include <varargs.h>
  74. #   define  VA_START(a, b)    va_start(a)
  75.  
  76. #   define  P(args)         ()
  77.  
  78. #   define  const
  79. #   define  volatile
  80.  
  81. #endif    /* not __STDC__ */
  82.  
  83. #endif    /* WIN32 not defined */
  84.  
  85. #ifdef    USE_STDHDRS
  86. #   include <stdlib.h>
  87. #   include <stddef.h>
  88. #   include <limits.h>
  89. #else    /* USE_STDHDRS not defined */
  90.     extern  FILE    *fopen();
  91.     extern  char    *malloc();
  92.     extern  char    *realloc();
  93.     extern  char    *getenv();
  94.     extern  long    atol();
  95.     extern  char    *memcpy();
  96.     extern  char    *memset();
  97.     extern  void    exit();
  98. #endif    /* USE_STDHDRS not defined */
  99.  
  100. #undef USE_STDHDRS
  101.  
  102. /*
  103.  * Functions which ANSI does not specify should
  104.  * be included in any standard header file.
  105.  */
  106. extern    int    chdir P((const char *path));
  107. extern    char    *getcwd P((char *, unsigned));
  108. extern    void    sleep P((unsigned seconds));
  109.  
  110. /*
  111.  * If we have ANSI C, these should be defined in limits.h:
  112.  */
  113. #ifndef INT_MAX
  114. #   define INT_MAX    ((int) ((unsigned int) ~0 >> 1))
  115. #endif
  116. #ifndef INT_MIN
  117. #   define INT_MIN    (~INT_MAX)
  118. #endif
  119. #ifndef ULONG_MAX
  120. #   define ULONG_MAX    0xffffffff
  121. #endif
  122.  
  123. /*
  124.  * Macro to convert a long to an int.
  125.  * If a long is the same as an int, this is trivial.
  126.  */
  127. #define    LONG2INT(n)    (sizeof(int) == sizeof(long) ? (int) (n) : \
  128.              (int) ((n) > INT_MAX ? INT_MAX : \
  129.               ((n) < INT_MIN ? INT_MIN : (n))))
  130.  
  131.  
  132. /***************************************************************
  133.  *                                                             *
  134.  * SECTION 2: FUNDAMENTAL TYPES                                *
  135.  *                                                             *
  136.  * These types are used by other included header files.        *
  137.  *                                                             *
  138.  ***************************************************************/
  139.  
  140. /*
  141.  * Boolean type.
  142.  * It would be possible to make this an enumerated type,
  143.  * but it isn't worth the hassle - enums don't confer any
  144.  * real advantages, and it means we can't do things like
  145.  *
  146.  *    bool_t    value = (i == 47);
  147.  *
  148.  * but instead are forced to write the abominable
  149.  *
  150.  *    bool_t    value = (i == 47) ? TRUE : FALSE;
  151.  *
  152.  * which is silly.
  153.  */
  154. #undef    FALSE            /* just in case */
  155. #undef    TRUE
  156. #define    FALSE        0
  157. #define    TRUE        1
  158. typedef    int        bool_t;
  159.  
  160.  
  161. /***************************************************************
  162.  *                                                             *
  163.  * SECTION 3: FUNDAMENTAL HEADER FILES                         *
  164.  *                                                             *
  165.  * These header files define types which are used by Xvi.      *
  166.  *                                                             *
  167.  ***************************************************************/
  168.  
  169. #include "virtscr.h"
  170.  
  171.  
  172. /***************************************************************
  173.  *                                                             *
  174.  * SECTION 4: MISCELLANEOUS DEFINITIONS                        *
  175.  *                                                             *
  176.  * Definitions of limits and suchlike used within the editor.  *
  177.  *                                                             *
  178.  ***************************************************************/
  179.  
  180. /*
  181.  * Minimum number of rows a window can have, including status line.
  182.  */
  183. #define    MINROWS        2
  184.  
  185. /*
  186.  * SLOP is the amount of extra space we get for text on a line during
  187.  * editing operations that need more space. This keeps us from calling
  188.  * malloc every time we get a character during insert mode. No extra
  189.  * space is allocated when the file is initially read.
  190.  */
  191. #define    SLOP        10
  192.  
  193. /*
  194.  * The number of characters taken up by the line number
  195.  * when "number" is set; up to 6 digits plus two spaces.
  196.  */
  197. #define    NUM_SIZE    8
  198. #define    NUM_FMT        "%6ld  "
  199.  
  200. /*
  201.  * (MAX_LINE_LENGTH - 1) gives the maximum line length this editor can read in.
  202.  * Used by fileio.c (getfile()) and pipe.c (p_read()).
  203.  */
  204. #define    MAX_LINE_LENGTH    1024
  205.  
  206. /*
  207.  * Maximum value for the tabstop parameter.
  208.  */
  209. #define    MAX_TABSTOP    32
  210.  
  211. /*
  212.  * Default timeout for keystrokes (in milliseconds).
  213.  * The timeout parameter is set to this value.
  214.  */
  215. #define    DEF_TIMEOUT    200
  216.  
  217.  
  218. /***************************************************************
  219.  *                                                             *
  220.  * SECTION 5: PARAMETER TYPE DEFINITIONS                       *
  221.  *                                                             *
  222.  * These are definitions of types for particular parameters.   *
  223.  *                                                             *
  224.  ***************************************************************/
  225.  
  226. /*
  227.  * Regular expression search modes - used in search.c.
  228.  * These are the integer values to which the P_regextype
  229.  * enumerated parameter may be set. Note that these values
  230.  * are ordered; e.g. rt_GREP is considered to be earlier
  231.  * than, and/or less than, rt_EGREP. If the types are added
  232.  * to, this ordering must be maintained. Also note that the
  233.  * names in the rt_strings table must follow the same order.
  234.  */
  235. #define rt_TAGS        0    /* only ^ and $ are significant */
  236. #define rt_GREP        1    /* like grep, but with \< and \> */
  237. #define rt_EGREP    2    /* like egrep, but with \< and \> */
  238.  
  239. /*
  240.  * Array of names for the P_regextype enumeration, defined in
  241.  * search.c.
  242.  */
  243. extern    char        *rt_strings[];
  244.  
  245. /*
  246.  * Integer values for the P_preserve enumerated parameter. Note that
  247.  * the names in psv_strings must follow the same order.
  248.  */
  249. #define psv_UNSAFE    0    /* never preserve buffer before writing */
  250. #define psv_STANDARD    1    /*
  251.                  * only preserve buffer before writing
  252.                  * if it hasn't been preserved recently
  253.                  */
  254. #define psv_SAFE    2    /* always preserve buffer before writing */
  255. #define psv_PARANOID    3    /*
  256.                  * like psv_SAFE, but never remove the
  257.                  * preserve file
  258.                  */
  259.  
  260. /*
  261.  * Array of names for the P_preserve enumeration, defined in
  262.  * search.c.
  263.  */
  264. extern    char        *psv_strings[];
  265.  
  266. /*
  267.  * Integer values for the P_format enumerated parameter. These are for
  268.  * the formats we know about so far. Note that the entries in
  269.  * fmt_strings & tftable (defined in fileio.c) must follow the same order.
  270.  */
  271. #define    fmt_CSTRING    0
  272. #define    fmt_MACINTOSH    1
  273. #define    fmt_MSDOS    2
  274. #define    fmt_OS2        3
  275. #define    fmt_QNX        4
  276. #define    fmt_TOS        5
  277. #define    fmt_UNIX    6
  278.  
  279. /*
  280.  * Array of names for the P_format enumeration.
  281.  */
  282. extern    char        *fmt_strings[];
  283.  
  284. /*
  285.  * Integer values for the P_jumpscroll enumerated parameter. Note that
  286.  * the entries in js_strings (defined in param.c) must follow the same
  287.  * order.
  288.  */
  289. #define    js_OFF        0
  290. #define    js_AUTO        1
  291. #define    js_ON        2
  292.  
  293. /***************************************************************
  294.  *                                                             *
  295.  * SECTION 6: EDITOR TYPE DEFINITIONS                          *
  296.  *                                                             *
  297.  ***************************************************************/
  298.  
  299. /*
  300.  * Possible editor states.
  301.  */
  302. typedef enum {
  303.     NORMAL,            /* command mode */
  304.     INSERT,            /* insert mode */
  305.     REPLACE,            /* overwrite mode */
  306.     CMDLINE,            /* on the : command line */
  307.     DISPLAY            /* in display mode (e.g. g//p or :set all) */
  308. } state_t;
  309.  
  310. extern    state_t        State;    /* defined in main.c */
  311.  
  312. /*
  313.  * Possible return values for cmd_input(), which deals with command
  314.  * line input. This is for commands starting with :, /, ? and !.
  315.  */
  316. typedef enum {
  317.     cmd_COMPLETE,        /* user hit return (cmd line available) */
  318.     cmd_INCOMPLETE,        /* not finished typing command line yet */
  319.     cmd_CANCEL            /* user aborted command line */
  320. } Cmd_State;
  321.  
  322. /*
  323.  * Possible directions for searching, and opening lines.
  324.  */
  325. #define    FORWARD        0
  326. #define    BACKWARD    1
  327.  
  328. /*
  329.  * Line structure and its friends.
  330.  *
  331.  * The structure used to hold a line; this is used to form
  332.  * a doubly-linked list of the lines comprising a file.
  333.  *
  334.  * The definition for MAX_LINENO depends on the type of
  335.  * l_number, and on the size of the machine; we are fairly
  336.  * safe setting all bits here so long as l_number is always
  337.  * an unsigned type. Should really use a lineno_t here, and
  338.  * get rid of the need for a maximum lineno.
  339.  */
  340. typedef    struct    line {
  341.     struct line        *l_prev;    /* previous line */
  342.     struct line        *l_next;    /* next line */
  343.     char        *l_text;    /* text for this line */
  344.     int            l_size;        /* actual size of space at 's' */
  345.     unsigned long    l_number;    /* line "number" */
  346. } Line;
  347.  
  348. #define    MAX_LINENO    ULONG_MAX
  349.  
  350. /*
  351.  * These pseudo-functions operate on lines in a buffer, returning TRUE
  352.  * or FALSE according to whether l1 is later or earlier than l2.
  353.  * Note that there is no macro for "same", which is excluded by both
  354.  * "earlier" and "later".
  355.  */
  356. #define    later(l1, l2)    ((l1)->l_number > (l2)->l_number)
  357. #define    earlier(l1, l2)    ((l1)->l_number < (l2)->l_number)
  358.  
  359. /*
  360.  * This macro gives the line number of line 'l' in buffer 'b'.
  361.  */
  362. #define    lineno(b, l)    ((l)->l_number)
  363.  
  364. /*
  365.  * Easy ways of finding out whether a given line is the first
  366.  * or last line of a buffer, without needing a buffer pointer.
  367.  */
  368. #define    is_lastline(lp)    ((lp)->l_number == MAX_LINENO)
  369. #define    is_line0(lp)    ((lp)->l_number == 0)
  370.  
  371.  
  372. /*
  373.  * Structure used to hold a position in a file;
  374.  * this is just a pointer to the line, and an index.
  375.  */
  376. typedef    struct    position {
  377.     Line        *p_line;    /* line we're referencing */
  378.     int            p_index;    /* position within that line */
  379. } Posn;
  380.  
  381. /*
  382.  * This is stuff to do with marks - it should be privately defined
  383.  * in mark.c, but it needs to be related to each individual buffer.
  384.  */
  385. #define    NMARKS    10        /* max. # of marks that can be saved */
  386.  
  387. typedef    struct    mark {
  388.     char        m_name;
  389.     Posn        m_pos;
  390. } Mark;
  391.  
  392. /*
  393.  * Structure used to record a single change to a buffer.
  394.  * A change may either be a number of lines replaced with a
  395.  * new set, a number of characters removed or a number of
  396.  * characters replaced with a new set. Character changes
  397.  * never straddle line boundaries. A list of these
  398.  * structures forms a complex change. There is also a fourth
  399.  * type of "change", which does not actually change the
  400.  * buffer, but is simply a record of the cursor position at
  401.  * the time of the start of the change. This is needed so
  402.  * that the cursor returns to the correct position after an
  403.  * "undo".
  404.  *
  405.  * This entire structure is only used in undo.c and alloc.c, and
  406.  * no other code should touch it.
  407.  */
  408. typedef    struct change {
  409.     struct change    *c_next;
  410.     enum {
  411.     C_LINE,
  412.     C_CHAR,
  413.     C_DEL_CHAR,
  414.     C_POSITION
  415.     }            c_type;
  416.     unsigned long    c_lineno;
  417.     union {
  418.     struct {
  419.         long    cul_nlines;
  420.         Line    *cul_lines;
  421.     }    cu_l;
  422.     struct {
  423.         int        cuc_index;
  424.         int        cuc_nchars;
  425.         char    *cuc_chars;
  426.     }    cu_c;
  427.     struct {
  428.         long    cup_line;
  429.         int        cup_index;
  430.     }    cu_p;
  431.     }            c_u;
  432. } Change;
  433.  
  434. #define    c_nlines    c_u.cu_l.cul_nlines
  435. #define    c_lines        c_u.cu_l.cul_lines
  436. #define    c_index        c_u.cu_c.cuc_index
  437. #define    c_nchars    c_u.cu_c.cuc_nchars
  438. #define    c_chars        c_u.cu_c.cuc_chars
  439. #define    c_pline        c_u.cu_p.cup_line
  440. #define    c_pindex    c_u.cu_p.cup_index
  441.  
  442. /*
  443.  * Variable-length FIFO queue of characters.
  444.  */
  445. typedef struct
  446. {
  447.     char        *fxb_chars;    /* pointer to allocated space */
  448.     unsigned    fxb_max;    /* size of allocated space */
  449.     unsigned    fxb_rcnt;    /* number of characters read */
  450.     unsigned    fxb_wcnt;    /* number of characters written */
  451. /* public: */
  452. /*
  453.  * Initialize a Flexbuf.
  454.  */
  455. #define            flexnew(f)    ((f)->fxb_wcnt = (f)->fxb_max = 0)
  456. /*
  457.  * Reset a Flexbuf by clearing its contents, but without freeing the
  458.  * dynamically allocated space.
  459.  */
  460. #define            flexclear(f)    ((f)->fxb_wcnt = 0)
  461. /*
  462.  * Test whether a Flexbuf is empty.
  463.  */
  464. #define            flexempty(f)    ((f)->fxb_rcnt >= (f)->fxb_wcnt)
  465. /*
  466.  * Remove last character from a Flexbuf.
  467.  */
  468. #define            flexrmchar(f)    (!flexempty(f) && --(f)->fxb_wcnt)
  469. /*
  470.  * Return number of characters in a Flexbuf.
  471.  */
  472. #define            flexlen(f)    (flexempty(f) ? 0 : \
  473.                      (f)->fxb_wcnt - (f)->fxb_rcnt)
  474. }
  475. Flexbuf;
  476.  
  477. /*
  478.  * Structure used to hold all information about a "buffer" -
  479.  * i.e. the representation of a file in memory.
  480.  */
  481. typedef struct buffer {
  482.     Line        *b_line0;    /* ptr to zeroth line of file */
  483.     Line        *b_file;    /* ptr to first line of file */
  484.     Line        *b_lastline;    /* ptr to (n+1)th line of file */
  485.  
  486.     /*
  487.      * All of these are allocated, and should be freed
  488.      * before assigning any new value to them.
  489.      */
  490.     char        *b_filename;    /* file name, if any */
  491.     char        *b_tempfname;    /* name for temporary copy of file */
  492.  
  493.     unsigned int     b_flags;    /* flags */
  494.  
  495.     int            b_nwindows;    /* no of windows open on this buffer */
  496.  
  497.     /*
  498.      * The following only used in mark.c.
  499.      */
  500.     Mark        b_mlist[NMARKS];    /* current marks */
  501.     Mark        b_pcmark;        /* previous context mark */
  502.     bool_t        b_pcvalid;        /* true if pcmark is valid */
  503.  
  504.     /*
  505.      * The following only used in undo.c.
  506.      */
  507.     unsigned int    b_nlevels;    /* number of brackets surrounding */
  508.                     /* current change to buffer */
  509.     Change        *b_change;    /* ptr to list of changes made */
  510.  
  511. } Buffer;
  512.  
  513. /*
  514.  * Definitions for the "flags" field of a buffer.
  515.  */
  516. #define    FL_MODIFIED    0x1
  517. #define    FL_READONLY    0x2
  518. #define    FL_NOEDIT    0x4
  519. #define    is_modified(b)    ((b)->b_flags & FL_MODIFIED)
  520. #define    is_readonly(b)    (Pb(P_readonly) || ((b)->b_flags & FL_READONLY))
  521. #define    not_editable(b)    ((b)->b_flags & FL_NOEDIT)
  522.  
  523. /*
  524.  * Structure used to hold information about a "window" -
  525.  * this is intimately associated with the Buffer structure.
  526.  */
  527. typedef struct window {
  528.     Posn        *w_cursor;    /* cursor's position in buffer */
  529.  
  530.     Buffer        *w_buffer;    /* buffer we are a window into */
  531.  
  532.     Line        *w_topline;    /* line at top of screen */
  533.     Line        *w_botline;    /* line below bottom of screen */
  534.  
  535.     VirtScr        *w_vs;        /* virtual screen for window */
  536.  
  537.     unsigned        w_nrows;    /* number of rows in window */
  538.     unsigned        w_ncols;    /* number of columns in window */
  539.     unsigned        w_winpos;    /* row of top line of window */
  540.     unsigned        w_cmdline;    /* row of window command line */
  541.  
  542.     /*
  543.      * These are used by the ^O command to store the previous
  544.      * size of the window so that we can return to it.
  545.      */
  546.     int            w_2winpos;    /* last row of top line of window */
  547.     int            w_2nrows;    /* last no of rows in buffer window */
  548.     int            w_2cmdline;    /* last row of window command line */
  549.  
  550.  
  551.     /*
  552.      * Allocated within screen.c.
  553.      */
  554.     Flexbuf        w_statusline;    /* status information on status line */
  555.  
  556.  
  557.     /*
  558.      * These elements are related to the cursor's position in the window.
  559.      */
  560.     int            w_row, w_col;    /* cursor's position in window */
  561.  
  562.     int            w_virtcol;    /* column number of the file's actual */
  563.                     /* line, as opposed to the column */
  564.                     /* number we're at on the screen. */
  565.                     /* This makes a difference on lines */
  566.                     /* which span more than one screen */
  567.                     /* line. */
  568.  
  569.     int            w_curswant;    /* The column we'd like to be at. */
  570.                     /* This is used to try to stay in */
  571.                     /* the same column through up/down */
  572.                     /* cursor motions. */
  573.  
  574.     bool_t        w_set_want_col;    /* If set, then update w_curswant */
  575.                     /* the next time through cursupdate() */
  576.                     /* to the current virtual column */
  577.  
  578.     int            w_c_line_size;    /* current size of cursor line */
  579.  
  580.     bool_t        w_curs_new;    /* true if cursor should be updated */
  581.  
  582.     /*
  583.      * The following only used in windows.c.
  584.      */
  585.     struct window    *w_last;    /* first and last pointers */
  586.     struct window    *w_next;
  587. } Xviwin;
  588.  
  589. /*
  590.  * Values returned by inc() & dec().
  591.  */
  592. enum mvtype {
  593.     mv_NOMOVE = -1,    /* at beginning or end of buffer */
  594.     mv_SAMELINE = 0,    /* still within same line */
  595.     mv_CHLINE = 1,    /* changed to different line */
  596.     mv_EOL = 2        /* in same line, at terminating '\0' */
  597. };
  598.  
  599. /*
  600.  * Number of input characters since the last buffer preservation.
  601.  */
  602. extern volatile int    keystrokes;
  603.  
  604. /*
  605.  * Minimum number of keystrokes after which we do an automatic
  606.  * preservation of all modified buffers.
  607.  */
  608. #define PSVKEYS        60
  609.  
  610. /*
  611.  * Exceptional return values for get_file().
  612.  */
  613. #define gf_NEWFILE    ((long)-1)    /* no such file */
  614. #define gf_CANTOPEN    ((long)-2)    /* error opening file */
  615. #define gf_IOERR    ((long)-3)    /* error reading from file */
  616. #define gf_NOMEM    ((long)-4)    /* not enough memory */
  617.  
  618. /*
  619.  * Editor input events. Handled by xvi_handle_event().
  620.  */
  621. typedef struct event {
  622.     enum {
  623.     Ev_char,
  624.     Ev_timeout
  625.     }            ev_type;
  626.     union {
  627.     /* Ev_char: */
  628.     int    evu_inchar;
  629.  
  630.     /* Ev_timeout: */
  631.     }            ev_u;
  632. } xvEvent;
  633.  
  634. #define    ev_inchar    ev_u.evu_inchar
  635.  
  636.  
  637. /***************************************************************
  638.  *                                                             *
  639.  * SECTION 7: MISCELLANEOUS MACROS                             *
  640.  *                                                             *
  641.  ***************************************************************/
  642.  
  643.  
  644. /***************************************************************
  645.  *                                                             *
  646.  * SECTION 8: XVI-LOCAL HEADER FILES                           *
  647.  *                                                             *
  648.  * Various subsidiary header files with definitions relating   *
  649.  * to particular areas of the editor (or its environment).     *
  650.  * Note that these header files may use definitions in this    *
  651.  * file, so are included after all types are defined.          *
  652.  *                                                             *
  653.  ***************************************************************/
  654.  
  655. #include "ascii.h"
  656. #include "param.h"
  657. #include "ptrfunc.h"
  658.  
  659.  
  660. /***************************************************************
  661.  *                                                             *
  662.  * SECTION 9: SYSTEM-SPECIFIC HEADER FILES                     *
  663.  *                                                             *
  664.  ***************************************************************/
  665.  
  666. /*
  667.  * Include file for system interface module.
  668.  * We must have one of these.
  669.  */
  670.  
  671. #ifdef    ATARI
  672. #   include "tos.h"
  673. #   define    GOT_OS
  674. #endif
  675.  
  676. #ifdef    UNIX
  677. #   include "unix.h"
  678. #   define    GOT_OS
  679. #endif
  680.  
  681. #ifdef    OS2
  682.     /*
  683.      * Microsoft's wonderful compiler defines MSDOS, even when
  684.      * we're compiling for OS/2, but it doesn't define OS2.
  685.      * Ingenious, eh?
  686.      */
  687. #   undef MSDOS
  688. #   include "os2vio.h"
  689. #   define    GOT_OS
  690. #endif
  691.  
  692. #ifdef    MSDOS
  693. #   include "msdos.h"
  694. #   define    GOT_OS
  695. #endif
  696.  
  697. #ifdef    QNX
  698. #   include "qnx.h"
  699. #   define    GOT_OS
  700. #endif
  701.  
  702. #ifdef WIN32
  703. #   include "nt.h"
  704. #   define    GOT_OS
  705. #endif
  706.  
  707. #ifndef    GOT_OS
  708.     no system-specific include file found
  709. #endif
  710.  
  711.  
  712. /***************************************************************
  713.  *                                                             *
  714.  * SECTION 10: GLOBAL VARIABLE DECLARATIONS                    *
  715.  *                                                             *
  716.  ***************************************************************/
  717.  
  718. /*
  719.  * Miscellaneous global vars.
  720.  */
  721. extern    Buffer        *curbuf;    /* current buffer */
  722. extern    Xviwin        *curwin;    /* current window */
  723.  
  724. extern    int        indentchars;    /* auto-indentation on current line */
  725. extern    char        *altfilename;    /* name of current alternate file */
  726. extern    char        Version[];    /* version string for :ve command */
  727.  
  728. /*
  729.  * This flag is set when a keyboard interrupt is received.
  730.  */
  731. extern volatile unsigned char kbdintr;
  732.  
  733. /*
  734.  * This one indicates whether we should display the "Interrupted"
  735.  * message.
  736.  */
  737. extern    bool_t        imessage;
  738.  
  739. /*
  740.  * This variable (defined in main.c) is a bitmap which controls the
  741.  * verbosity of screen output. The meanings of the individual bits
  742.  * are:
  743.  *
  744.  *    e_CHARUPDATE means it's OK to update individual characters in
  745.  *    any window.
  746.  *
  747.  *    e_SCROLL means it's OK to scroll any area of the screen up or
  748.  *    down.
  749.  *
  750.  *    e_REPORT means it's OK for report() to report the number of
  751.  *    lines inserted or deleted.
  752.  *
  753.  *    e_SHOWINFO means it's OK for show_file_info() to display file
  754.  *    information for any buffer.
  755.  *
  756.  *    e_BEEP: not implemented yet.
  757.  *
  758.  *    e_REGERR means it's OK for functions in search.c to display
  759.  *    messages which may have resulted from an invalid regular
  760.  *    expression string.
  761.  *
  762.  *    e_NOMATCH means it's OK for functions in search.c to complain
  763.  *    if they fail to match a regular expression at least once.
  764.  *
  765.  * If we're reading an input sequence & e_CHARUPDATE & e_SCROLL are
  766.  * turned off, no screen updating will be done until an ESC is
  767.  * received.
  768.  */
  769. extern    unsigned    echo;
  770.  
  771. #define    e_CHARUPDATE    1
  772. #define    e_SCROLL    2
  773. #define    e_REPORT    4
  774. #define    e_SHOWINFO    010
  775. #define    e_BEEP        020
  776. #define    e_REGERR    040
  777. #define    e_NOMATCH    0100
  778.  
  779. #define e_ANY        0xffff
  780.  
  781.  
  782. /***************************************************************
  783.  *                                                             *
  784.  * SECTION 11: FUNCTION DECLARATIONS                           *
  785.  *                                                             *
  786.  ***************************************************************/
  787.  
  788. /*
  789.  * Declarations of all the routines exported from the various .c files.
  790.  */
  791.  
  792. /*
  793.  * main.c
  794.  */
  795. extern    Xviwin    *xvi_startup P((VirtScr *, int, char **, char *));
  796.  
  797. /*
  798.  * alloc.c
  799.  */
  800. extern    Change    *challoc P((void));
  801. extern    void    chfree P((Change *));
  802. extern    char    *alloc P((unsigned int));
  803. extern    char    *strsave P((const char *));
  804. extern    Line    *newline P((int));
  805. extern    bool_t    bufempty P((Buffer *));
  806. extern    bool_t    buf1line P((Buffer *));
  807. extern    bool_t    endofline P((Posn *));
  808. extern    bool_t    grow_line P((Line *, int));
  809. extern    void    throw P((Line *));
  810.  
  811. /*
  812.  * ascii.c
  813.  */
  814. extern unsigned vischar P((int, char **, int));
  815.  
  816. /*
  817.  * buffers.c
  818.  */
  819. extern    Buffer    *new_buffer P((void));
  820. extern    void    free_buffer P((Buffer *));
  821. extern    bool_t    clear_buffer P((Buffer *));
  822. extern    int    nbuffers;
  823.  
  824. /*
  825.  * edit.c
  826.  */
  827. extern    bool_t    i_proc P((int));
  828. extern    bool_t    r_proc P((int));
  829. extern    void    startinsert P((int));
  830. extern    void    startreplace P((int));
  831. extern    char    *mkstr P((int));
  832.  
  833. /*
  834.  * events.c
  835.  */
  836. extern    long    xvi_handle_event P((xvEvent *));
  837.  
  838. /*
  839.  * cmdline.c
  840.  */
  841. extern    void    do_colon P((char *, bool_t));
  842. extern    void    wait_return P((void));
  843.  
  844. /*
  845.  * cursor.c
  846.  */
  847. extern    void    cursupdate P((Xviwin *));
  848. extern    void    curs_horiz P((Xviwin *, int));
  849.  
  850. /*
  851.  * ex_cmds1.c
  852.  */
  853. extern    void    do_quit P((Xviwin *, bool_t));
  854. extern    void    do_split_window P((Xviwin *));
  855. extern    bool_t    do_buffer P((Xviwin *, char *));
  856. extern    void    do_close_window P((Xviwin *, bool_t));
  857. extern    void    do_xit P((Xviwin *));
  858. extern    bool_t    do_edit P((Xviwin *, bool_t, char *));
  859. extern    void    do_args P((Xviwin *));
  860. extern    void    do_next P((Xviwin *, int, char **, bool_t));
  861. extern    void    do_rewind P((Xviwin *, bool_t));
  862. extern    bool_t    do_write P((Xviwin *, char *, Line *, Line *, bool_t));
  863. extern    void    do_wq P((Xviwin *, char *, bool_t));
  864. extern    void    do_read P((Xviwin *, char *, Line *));
  865. extern    void    do_alt_edit P((Xviwin *));
  866. extern    void    do_compare P((void));
  867.  
  868. /*
  869.  * ex_cmds2.c
  870.  */
  871. extern    void    do_shell P((Xviwin *));
  872. extern    void    do_shcmd P((Xviwin *, char *));
  873. extern    void    do_suspend P((Xviwin *));
  874. extern    void    do_equals P((Xviwin *, Line *));
  875. extern    void    do_help P((Xviwin *));
  876. extern    bool_t    do_source P((bool_t, char *));
  877. extern    char    *do_chdir P((char *));
  878. extern    void    do_cdmy P((int, Line *, Line *, Line *));
  879.  
  880. /*
  881.  * fileio.c
  882.  */
  883. extern    bool_t    set_format P((Xviwin *, Paramval, bool_t));
  884. extern    long    get_file P((Xviwin *, char *, Line **, Line **, char *,
  885.                             char *));
  886. extern    bool_t    writeit P((Xviwin *, char *, Line *, Line *, bool_t));
  887. extern    bool_t    put_file P((Xviwin *, FILE *, Line *, Line *,
  888.                 unsigned long *, unsigned long *));
  889.  
  890. /*
  891.  * find.c
  892.  */
  893. extern    Posn    *searchc P((int, int, int, int));
  894. extern    Posn    *crepsearch P((Buffer *, int, int));
  895. extern    Posn    *showmatch P((void));
  896. extern    Posn    *find_pattern P((char *, int, int));
  897. extern    Posn    *fwd_word P((Posn *, int, bool_t));
  898. extern    Posn    *bck_word P((Posn *, int, bool_t));
  899. extern    Posn    *end_word P((Posn *, int, bool_t));
  900. extern    bool_t    dosearch P((Xviwin *, char *, int));
  901.  
  902. /*
  903.  * flexbuf.c
  904.  */
  905. extern    bool_t    flexaddch P((Flexbuf *, int));
  906. extern    char    *flexgetstr P((Flexbuf *));
  907. extern    int    flexpopch P((Flexbuf *));
  908. extern    void    flexdelete P((Flexbuf *));
  909. extern    bool_t    vformat P((Flexbuf *, char *, va_list));
  910. extern    bool_t    lformat P((Flexbuf *, char *, ...));
  911.  
  912. /*
  913.  * map.c
  914.  */
  915. extern    void    stuff P((char *, ...));
  916. extern    int    map_getc P((void));
  917. extern    void    map_char P((int));
  918. extern    void    map_timeout P((void));
  919. extern    bool_t    map_waiting P((void));
  920. extern    int    mapped_char P((int));
  921. extern    void    xvi_map P((int, char **, bool_t, bool_t));
  922. extern    void    xvi_keymap P((char *, char *));
  923. extern    void    xvi_unmap P((int, char **, bool_t, bool_t));
  924. extern    void    do_unmap P((int, char **, bool_t, bool_t));
  925.  
  926. /*
  927.  * mark.c
  928.  */
  929. extern    void    init_marks P((Buffer *));
  930. extern    bool_t    setmark P((int, Buffer *, Posn *));
  931. extern    void    setpcmark P((Xviwin *));
  932. extern    Posn    *getmark P((int, Buffer *));
  933. extern    void    clrmark P((Line *, Buffer *));
  934.  
  935. /*
  936.  * misccmds.c
  937.  */
  938. extern    bool_t    openfwd P((bool_t));
  939. extern    bool_t    openbwd P((void));
  940. extern    long    cntllines P((Line *, Line *));
  941. extern    long    cntplines P((Xviwin *, Line *, Line *));
  942. extern    long    plines P((Xviwin *, Line *));
  943. extern    Line    *gotoline P((Buffer *, unsigned long));
  944. extern    int    get_indent P((Line *));
  945. extern    int    set_indent P((Line *, int));
  946. extern    void    tabinout P((int, Line *, Line *));
  947. extern    void    makeargv P((char *, int *, char ***, char *));
  948.  
  949. /*
  950.  * mouse.c
  951.  */
  952. extern    void    mouseclick P((int, int));
  953. extern    void    mousedrag P((int, int, int, int));
  954.  
  955. /*
  956.  * movement.c
  957.  */
  958. extern    int    shiftdown P((Xviwin *, unsigned));
  959. extern    int    shiftup P((Xviwin *, unsigned));
  960. extern    void    scrolldown P((Xviwin *, unsigned));
  961. extern    void    scrollup P((Xviwin *, unsigned));
  962. extern    bool_t    oneup P((Xviwin *, long));
  963. extern    bool_t    onedown P((Xviwin *, long));
  964. extern    bool_t    one_left P((Xviwin *, bool_t));
  965. extern    bool_t    one_right P((Xviwin *, bool_t));
  966. extern    void    begin_line P((Xviwin *, bool_t));
  967. extern    void    coladvance P((Xviwin *, int));
  968. extern    void    do_goto P((long));
  969. extern    void    move_cursor P((Xviwin *, Line *, int));
  970. extern    void    move_window_to_cursor P((Xviwin *));
  971. extern    void    move_cursor_to_window P((Xviwin *));
  972.  
  973. /*
  974.  * normal.c
  975.  */
  976. extern    bool_t    normal P((int));
  977.  
  978. /*
  979.  * param.c
  980.  */
  981. extern    void    init_params P((void));
  982. extern    void    do_set P((Xviwin *, int, char **, bool_t));
  983. extern    void    set_param P((int, ...));
  984.  
  985. /*
  986.  * pipe.c
  987.  */
  988. extern    void    specify_pipe_range P((Xviwin *, Line *, Line *));
  989. extern    void    do_pipe P((Xviwin *, char *));
  990.  
  991. /*
  992.  * preserve.c
  993.  */
  994. extern    bool_t    preservebuf P((Xviwin *));
  995. extern    bool_t    do_preserve P((void));
  996.  
  997. /*
  998.  * ptrfunc.c
  999.  */
  1000. extern    enum mvtype    inc P((Posn *));
  1001. extern    enum mvtype    dec P((Posn *));
  1002. extern    void    pswap P((Posn *, Posn *));
  1003. extern    bool_t    lt P((Posn *, Posn *));
  1004.  
  1005. /*
  1006.  * screen.c
  1007.  */
  1008. extern    void    init_screen P((Xviwin *));
  1009. extern    void    updateline P((Xviwin *));
  1010. extern    void    update_sline P((Xviwin *));
  1011. extern    void    update_window P((Xviwin *));
  1012. extern    void    update_all P((void));
  1013. extern    void    redraw_screen P((void));
  1014. extern    void    clear P((Xviwin *));
  1015. extern    void    s_ins P((Xviwin *, int, int));
  1016. extern    void    s_del P((Xviwin *, int, int));
  1017. extern    void    s_inschar P((Xviwin *, int));
  1018. extern    void    wind_goto P((Xviwin *));
  1019. extern    void    cmd_init P((Xviwin *, int));
  1020. extern    Cmd_State
  1021.         cmd_input P((Xviwin *, int));
  1022. extern    char    *get_cmd P((Xviwin *));
  1023. extern    void    gotocmd P((Xviwin *, bool_t));
  1024. extern    void    prompt P((char *));
  1025. extern    void    beep P((Xviwin *));
  1026. extern    void    disp_init P((Xviwin *, char *(*) P((void)), int, bool_t));
  1027. extern    bool_t    disp_screen P((Xviwin *));
  1028.  
  1029. /*
  1030.  * search.c
  1031.  */
  1032. extern    Posn    *search P((Xviwin *, Line *, int, int, char **));
  1033. extern    Posn    *nsearch P((Xviwin *, Line *, int, int, char *));
  1034. extern    Line    *linesearch P((Xviwin *, int, char **));
  1035. extern    void    do_global P((Xviwin *, Line *, Line *, char *, bool_t));
  1036. extern    long    do_substitute P((Xviwin *, Line *, Line *, char *));
  1037. extern    long    do_ampersand P((Xviwin *, Line *, Line *, char *));
  1038. extern    long    do_tilde P((Xviwin *, Line *, Line *, char *));
  1039.  
  1040. /*
  1041.  * signal.c
  1042.  */
  1043. extern    void    ignore_signals P((void));
  1044. extern    void    catch_signals P((void));
  1045.  
  1046. /*
  1047.  * status.c
  1048.  */
  1049. extern    void    init_sline P((Xviwin *));
  1050. extern    void    show_message P((Xviwin *, char *, ...));
  1051. extern    void    show_error P((Xviwin *, char *, ...));
  1052. extern    void    show_file_info P((Xviwin *));
  1053.  
  1054. /*
  1055.  * tags.c
  1056.  */
  1057. extern    bool_t    set_tags P((Xviwin *, Paramval, bool_t));
  1058. extern    void    tagword P((void));
  1059. extern    bool_t    do_tag P((Xviwin *, char *, bool_t, bool_t, bool_t));
  1060.  
  1061. /*
  1062.  * undo.c
  1063.  */
  1064. extern    void    init_undo P((Buffer *));
  1065. extern    bool_t    start_command P((Xviwin *));
  1066. extern    void    end_command P((Xviwin *));
  1067. extern    void    replchars P((Xviwin *, Line *, int, int, char *));
  1068. extern    void    repllines P((Xviwin *, Line *, long, Line *));
  1069. extern    void    replbuffer P((Xviwin *, Line *));
  1070. extern    void    undo P((Xviwin *));
  1071. extern    bool_t    set_edit P((Xviwin *, Paramval, bool_t));
  1072.  
  1073. /*
  1074.  * windows.c
  1075.  */
  1076. extern    Xviwin    *init_window P((VirtScr *));
  1077. extern    void    free_window P((Xviwin *));
  1078. extern    Xviwin    *split_window P((Xviwin *));
  1079. extern    void    map_window_onto_buffer P((Xviwin *, Buffer *));
  1080. extern    void    unmap_window P((Xviwin *));
  1081. extern    Xviwin    *next_window P((Xviwin *));
  1082. extern    Xviwin    *find_window P((Xviwin *, char *));
  1083. extern    void    resize_window P((Xviwin *, int));
  1084. extern    int    move_sline P((Xviwin *, int));
  1085. extern    void    update_buffer P((Buffer *));
  1086. extern    bool_t    can_split P((void));
  1087.  
  1088. /*
  1089.  * yankput.c
  1090.  */
  1091. extern    void    init_yankput P((void));
  1092. extern    bool_t    do_yank P((Buffer *, Posn *, Posn *, bool_t, int));
  1093. extern    bool_t    yank_str P((int, char *, bool_t));
  1094. extern    void    do_put P((Xviwin *, Posn *, int, int));
  1095. extern    void    yp_stuff_input P((Xviwin *, int, bool_t));
  1096. extern    void    yp_push_deleted P((void));
  1097.